进程
进程的工作流程
1.当程序运行的时候会产生父进程,并可能fock多个子进程
2.当父进程接收到任务调度的时候,将任务交给派生的子进程处理,子进程会继承父进程属性。
3.子进程在处理任务的时候,父进程会进入等待状态中。
4.子进程处理完成后,会发出信号并执行退出,退出前会唤醒父进程来回收子进程的资源
5.如果子进程在处理任务过程中异常退出终止,父进程就可能没有回收子进程的资源,导致子进程虽然实体已经消失,但仍在内核中的进程表中占据记录(僵尸进程),长期下去会浪费系统资源
6.如果子进程在处理任务过程中,父进程退出或意外终止,则子进程可能未退出,那么子进程就没有父进程来管理了,由系统的system进程管理(孤儿进程)
7.每个父进程叫PPID,子进程叫PID
进程优先级
进程执行时候是排队执行的,需要插队,要调整。
进程重要性高,需要优先多分配CPU。调整优先级。
nice: 调整【程序运行时】的优先级
renice:调整【运行中的进程】的优先级
区别:
nice命令常用于修改未运行的程序再运行时的优先级,
但是对于正在运行的进程,若想要修改优先级,就需要用到renice命令。
内存
清除buff/cache缓存
echo 1 > /proc/sys/vm/drop_caches #清理页面缓存(page cache)。页面缓存用于缓存文件系统的数据,以提高读写性能。
echo 2 > /proc/sys/vm/drop_caches #清理 dentries 和 inodes 缓存。dentries 缓存用于存储目录项(即文件路径),inodes 缓存用于存储文件的元数据(如权限、大小等)。
echo 3 > /proc/sys/vm/drop_caches #清理页面缓存、dentries 和 inodes 缓存。这是最常用的选项,因为它会清空所有类型的缓存。
查看内存使用情况
使用 top 或者 free、vmstat 命令
free -h
total used free shared buff/cache available
Mem: 972M 120M 727M 7.6M 123M 715M
Swap: 2.0G 0B 2.0G
shared 是共享内存的大小,一般系统不会用到,总是 0
buffers/cache 是缓存和缓冲区的大小,buffers 是对原始磁盘块的缓存,cache 是从磁盘读取文件系统里文件的页缓存
available 是新进程可用内存的大小
内存生产排障案例
内存 swap 过高
Swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用。swap 换出,把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。swap 换入,在进程再次访问这些内存的时候,把它们从磁盘读到内存中来
swap 和 内存回收的机制
内存的回收既包括了文件页(内存映射获取磁盘文件的页)又包括了匿名页(进程动态分配的内存)
对文件页的回收,可以直接回收缓存,或者把脏页写回磁盘后再回收
而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存
swap 过高会造成严重的性能问题,页失效会导致频繁的页面在内存和磁盘之间交换
一般线上的服务器的内存都很大,可以禁用 swap
可以设置 /proc/sys/vm/min_free_kbytes,来调整系统定期回收内存的阈值,也可以设置 /proc/sys/vm/swappiness,来调整文件页和匿名页的回收倾向
cpu
进程上下文切换:
无法获取资源而导致的自愿上下文切换
被系统强制调度导致的非自愿上下文切换
CPU 使用率
用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙
系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙
等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,说明系统与硬件设备的 I/O 交互时间比较长
软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,表明系统发生了大量的中断
怎么排查 CPU 过高问题
先使用 top 命令,查看系统相关指标。如需要按某指标排序则 使用top -o 字段名, -o可以指定排序字段,顺序从大到小
top -o %MEM
top - 15:24:58 up 49 min, 3 users, load average: 0.36, 0.16, 0.09
Tasks: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 2.7 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995456 total, 745644 free, 124492 used, 125320 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 733004 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
925 root 20 0 574280 19516 6148 S 0.0 2.0 0:00.48 tuned
655 polkitd 20 0 612240 12220 4752 S 0.0 1.2 0:00.07 polkitd
657 root 20 0 626676 9208 7036 S 0.0 0.9 0:00.17 NetworkManager
1615 root 20 0 162232 6672 4900 S 0.7 0.7 0:12.43 sshd
653 root 20 0 168308 5180 3748 S 0.0 0.5 0:00.02 VGAuthService
654 root 20 0 273192 4880 3748 S 0.0 0.5 0:04.19 vmtoolsd
924 root 20 0 113004 4332 3296 S 0.0 0.4 0:00.00 sshd
1087 postfix 20 0 89980 4120 3112 S 0.0 0.4 0:00.00 qmgr
找到相关进程后,我们则可以使用top -Hp pid或pidstat -t -p pid命令查看进程具体线程使用 CPU 情况,从而找到具体的导致 CPU 高的线程
% us 过高,则可以在对应 Java 服务根据线程 ID 查看具体详情,是否存在死循环,或者长时间的阻塞调用。Java 服务可以使用 jstack
如果是 % sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的
如果是 % si 过高,则可能是网络问题导致软中断频率飙高
% wa 过高,则是频繁读写磁盘导致的。
cpu生产排障案例
kswapd0 进程占用 CPU 较高
操作系统使用分页机制来管理物理内存。操作系统将磁盘的一部分划出来作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中。由于内存持续不足,这个换页动作持续进行。kswapd0 是虚拟内存管理中负责换页的进程,当服务器内存不足的时候 kswapd0 会执行换页操作,这个换页操作是十分消耗主机 CPU 资源的。如果通过 top 命令发现该进程持续处于非睡眠状态,且运行时间较长,可以初步判定系统在持续的进行换页操作,可以将问题转向内存不足的原因来排查。
kswapd0 进程占用了系统大量 CPU 资源
执行如下命令,查看 kswapd0 进程。top 系统显示类似如下,发现 kswapd0 进程持续处于非睡眠状态,且运行时间较长并持续占用较高 CPU 资源,则通常是由于系统在持续的进行换页操作所致。
通过 free 、ps 等指令进一步查询系统及系统内进程的内存占用情况,做进一步排查分析
针对系统当前内存不足的问题,您可以重启一些服务,释放内存
平均负载(load average)
w或者top或者uptime都可以看负载的指标
什么是平均负载:
衡量系统繁忙的一个综合指标,主要是CPU,IO,网络的繁忙程度。工作中非常常用,具体哪个指标繁忙
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
系统平均负载被定义为在特定时间间隔内【CPU运行队列中的平均进程数】。如果一个进程满足以下条件则其就会位于运行队列中:
1.可运行状态进程:
是指正在被CPU处理或者正在等待CPU处理的进程,
ps命令看到处于R状态的进程。可运行状态: S R 占用cpu
2.不可中断进程:
系统中最常见的是等待硬件设备的I/O响应,
3.ps命令中看到的D 状态进程。
平均负载其实就是【单位时间内的活跃进程数】。
负载不要超过5,是临界点。
2颗单颗4核CPU,共8核,负载就是8*70%=5左右
查看系统的平均负载
uptime ##或者top等
10:54:52 up 1124 days, 16:31, 6 users, load average: 3.67, 2.13, 1.79
10:54:52 是当前时间;
up 1124 days, 16:31 是系统运行时间;
6 users 则是正在登录用户数。
而最后三个数字依次是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数
当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能
平均负载与 CPU 使用率关系
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高
平均负载生产排障案例
CPU 使用率较低但负载较高
当前 Linux 系统没有业务程序运行。通过 top 命令观察,发现 CPU 很空闲,但是 load average 却非常高,如下图所示。
load average 是对 CPU 负载进行评估的,其值越高说明其任务队列越长,处于等待执行的任务越多。出现此种情况时,可能是由于僵死进程导致的。可以通过ps -axjf命令查看是否存在D+状态进程,该状态是指不可中断的睡眠状态。处于该状态的进程无法终止,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。
常用命令
ps
a | 显示与终端相关的所有进程,包含每个进程的完整路径 |
---|---|
x | 显示与终端无关的所有进程 |
u | 显示进程的用户信息 |
-u | 显示指定用户的进程信息 |
-e | 显示所有进程 |
-f | 额外显示UID,PPID,C与STIME栏位 |
f | 显示进程数 |
-H | 显示进程数 |
-l | 以详细的格式来显示进程状况 |
ps -ef 的结果详解:
UID :该进程的UID
PID:进程的标识号
PPID:该进程的父进程标识号
C:cpu使用的资源百分比
STIME :进程开始的时间
TTY :该进程是在哪个终端机上运作,若与终端机无关,则显示?,tty1-tty6则表示是本机上面的登入者进程,pts/0等,则表示为由网络连接进主机的进程。
TIME :进程所使用的总的cpu时间
CMD:正在执行的命令行
ps aus的结果详解:
USER:用户
PID:进程的标识号
%CPU:使用掉的cpu百分比
%MEM:占用的物理内存百分比
VSZ:占用的虚拟内存量(KB)
RSS:占用的物理内存大小
TTY:该进程是在哪个终端机上运作,若与终端机无关,则显示?,tty1-tty6则表示是本机上面的登入者进程,pts/0等,则表示为由网络连接进主机的进程。
STAT:该进程目前的状态,R表示进ps程运行,S表示可中断进程(随时),T表示进程被暂停(挂起),D表示不可中断进程,Z表示僵尸进程。
START:该进程被触发的时间
TIME:进程所使用的总的cpu时间
COMMAND:该进程的实际命令,[方括号]属于内核态的进程,没有[]的属于用户态进程
pstree
以树形结构显示进程和进程之间的关系
-a | 显示启动每个进程对应的完整指令,包含启动进程的路径,参数等 |
---|---|
-c | 不精简显示进程信息,即显示的进程中包含子进程和父进程 |
-h | 对现在执行的程序进行特别标注 |
-n | 根据进程PID号来排序输出,默认是以程序名来排序输出的 |
-p | 显示进程的PID |
-u | 显示进程对应的用户名称 |
strace
系统调用:系统为应用程序提供的连接接口
进程执行:调用很多接口。。
strace是Linux环境下的一款程序调试工具,用来检查一个应用程序所使用的系统调用及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行消耗的时间等。
-p pid 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可※
-f 跟踪目标进程,以及目标进程创建的所有子进程※
-tt 在输出中的每一行前加上时间信息,精确到微秒。例子:11:18:59.759546※
小结:strace命令很适合程序僵尸、命令执行报错等的问题,如果从程序日志和系统日志中看不出问题出现的原因,
就可以strace一下,也许有答案,不过也需要使用者有足够的耐心去查看输出!
top
执行top命令后,默认会出现如下内容:
top命令输出了很多参数,真正的服务器负载情况我们要综合其他参数一起看,运行结果可以分为两部分:
第一部分是前5行,是系统整体的统计信息;
第二部分是第8行开始的进程信息,我们从上往下逐行依次进行说明。
系统整体的统计信息
第一行
top - 16:20:38 up 12 days, 5:24, 2 users, load average: 0.04, 0.03, 0.05
top:当前时间。
up:机器运行了多长时间。
users:当前登录用户数。
load average:系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
这里具体需要关注的还是load average三个数值。先来说说定义吧:在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。三个数字分别代表了1分钟,5分钟,15分钟的统计值,这个数值的确能反应服务器的负载情况。
但是,这个数值高了也并不能直接代表这台机器的性能有问题,可能是因为正在进行CPU密集型的计算,也有可能是因为I/O问题导致运行队列堵了。所以,当我们看到这个数值飙升的时候,还得具体问题具体分析。
大家都知道,一个CPU在一个时间片里面只能运行一个进程,CPU核数的多少直接影响到这台机器在同时间能运行的进程数。所以一般来说Load Average的数值别超过这台机器的总核数,就基本没啥问题。
第二行
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
Tasks:当前有多少进程。
running:正在运行的进程数。
sleeping:正在休眠的进程数。
stopped:停止的进程数。
zombie:僵尸进程数。
这里running越多,服务器自然压力就越大。
第三行
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0si, 0.0 st
us:用户空间占CPU的百分比(像shell程序、各种语言的编译器、各种应用、web服务器和各种桌面应用都算是运行在用户地址空间的进程,这些程序如果不是处于idle状态,那么绝大多数的CPU时间都是运行在用户态)。
sy:内核空间占CPU的百分比(所有进程要使用的系统资源都是由Linux内核处理的,对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,因此在调查IO相关的问题时需要着重关注它)。
ni:用户进程空间改变过优先级(ni是nice的缩写,可以通过nice值调整进程用户态的优先级,这里显示的ni表示调整过nice值的进程消耗掉的CPU时间,如果系统中没有进程被调整过nice值,那么ni就显示为0)。
id:空闲CPU占用率。
wa:等待输入输出的CPU时间百分比(和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如,CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的)。
hi:硬中断占用百分比【硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理(消耗CPU时间)】。
si:软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)。
st:steal time。
第四行
KiB Mem : 1863012 total, 1286408 free, 216532 used, 360072 buff/cache
total:物理内存总量。
free:空闲内存量。
used:使用的内存量。
buffer/cache:用作内核缓存的内存量。
第五行
KiB Swap: 5242876 total, 7999484 free, 0 used. 1468240 avail Mem
total:交换区内存总量。
free:空闲交换区总量。
used:使用的交换区总量。
buffer/cache:缓冲的交换区总量。
第四第五行分别是内存信息和swap信息,所有程序的运行都是在内存中进行的,所以内存的性能对与服务器来说非常重要。不过当内存的free变少的时候,其实我们并不需要太紧张。真正需要看的是Swap中的used信息。
Swap分区是由硬盘提供的交换区,当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。
进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21829 root 20 0 0 0 0 S 0.7 0.6 129:53.91 java
22559 root 20 0 158920 5628 4268 S 0.3 9.2 139:42.81 java
22598 root 20 0 162112 2208 1540 S 0.3 0.1 0:04.68 fluentd
PID 进程id
USER 进程所有者的用户名
PR 优先级
NI nice值,负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列,还有一些参数,例如:
PPID 父进程id
GROUP 进程所有者的组名
SWAP: 进程使用的虚拟内存中被换出的大小
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志
top交互命令使用
通过按f键可以编辑显示内容,按f键后,会出现下图
根据上图可知:
①当前是按照%CPU这一列来排序的。
②可以通过上、下键来选择。
③按右键可以选择整个列,然后按上、下键来移动整个列的显示位置,前移或后移,按回车确定。
④按空格键来显示或隐藏该列,带*的是显示,不带*的是不显示。
⑤按s键可以将当前列设置为排序列。
⑥按q键退出。
1. 敲top后,按键盘数字“1”可以监控每个逻辑CPU的状况
2. 敲top后,输入u,然后输入用户名,则可以查看相应的用户进程
3. 敲top后,top命令默认以K为单位显示内存大小,我们可以通过大写字母E来切换内存信息区域的显示单位,如下按一下E切换到MB,再按一下E切换到GB
4. 敲top后,输入h进入top命令的帮助文档,了解更多关于top的用法
top常用参数
-d 指定刷新的时间,如希望没秒刷新一次,则使用:top -d 1
-p 通过指定PID来仅仅监控某个进程的状态
-S 指定累计模式
-s 使top命令在安全模式中运行,这将除去交互命令所带来的潜在危险
-H 输出某个特定进程<pid>并检查该进程内运行的线程状况:top -H -p <pid>
lsof
lsof 命令常用于查找进程打开了哪些文件以及与打开文件相关联的内容
常用参数
-p pid : 输出指定进程打开的文件;
-l : 输出中使用ID代替用户名;
-u userName : 输出指定用户打开的文件;
-c string : 输出 COMMAND 列中包含 string 的项;
-d fd : 输出包含指定描述符的项;
fileName : 输出打开文件 fil eName 的所有项;
无参数
lsof
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 236 64 /
systemd 1 root rtd DIR 253,0 236 64 /
systemd 1 root txt REG 253,0 1616360 67485964 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20112 33750391 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265624 33750457 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 33628492 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 33750414 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 33750402 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 33750102 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 33591164 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 33750139 /usr/lib64/libpcre.so.1.2.0
……
……
其中,每列参数的含义如下:
1. COMMAND : 命令名称;
2. PID : 进程ID
3. TID : 线程ID,如果为空代表列出的是进程;
4. TASKCMD : 任务名称,通常与 COMMAND 相同;
5. USER : 用户ID号或登录名;
6. FD : 文件描述符;
7. TYPE : 与文件关联结点的类型;
8. DEVICE : 设备号;
9. SIZE/OFF : 文件大小/偏移量,以字节为单位;
10. NODE : 文件结点;
11. NAME : 文件挂载点和文件所在的系统;
-p 参数
列出 1号 进程打开的文件
lsof -p 1
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 236 64 /
systemd 1 root rtd DIR 253,0 236 64 /
systemd 1 root txt REG 253,0 1616360 67485964 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20112 33750391 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265624 33750457 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 33628492 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 33750414 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 33750402 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 33750102 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 33591164 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 33750139 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2156272 33591158 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142144 33623171 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 33591127 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 43712 33623176 /usr/lib64/librt-2.17.so
……
-l 参数
输出中使用用户 ID 代替用户名,如下所示
lsof -l
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 0 cwd DIR 253,0 236 64 /
systemd 1 0 rtd DIR 253,0 236 64 /
systemd 1 0 txt REG 253,0 1616360 67485964 /usr/lib/systemd/systemd
systemd 1 0 mem REG 253,0 20112 33750391 /usr/lib64/libuuid.so.1.3.0
systemd 1 0 mem REG 253,0 265624 33750457 /usr/lib64/libblkid.so.1.1.0
systemd 1 0 mem REG 253,0 90248 33628492 /usr/lib64/libz.so.1.2.7
……
例子中,USER 列显示的是用户ID而不是用户名。
-u 参数
执行命令 lsof -u root,输出 root 用户打开的文件,如下所示
lsof -u root
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 236 64 /
systemd 1 root rtd DIR 253,0 236 64 /
systemd 1 root txt REG 253,0 1616360 67485964 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20112 33750391 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265624 33750457 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 33628492 /usr/lib64/libz.so.1.2.7
……
-c 参数
执行命令 lsof -c sshd,输出 COMMAND 列包含 sshd 的项,如下所示:
lsof -c sshd
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 9237 root cwd DIR 253,0 236 64 /
sshd 9237 root rtd DIR 253,0 236 64 /
sshd 9237 root txt REG 253,0 853040 35966750 /usr/sbin/sshd
sshd 9237 root mem REG 253,0 61560 33617054 /usr/lib64/libnss_files-2.17.so
sshd 9237 root mem REG 253,0 68192 33750408 /usr/lib64/libbz2.so.1.0.6
sshd 9237 root mem REG 253,0 100008 33750485 /usr/lib64/libelf-0.172.so
sshd 9237 root mem REG 253,0 19896 33750102 /usr/lib64/libattr.so.1.1.0
sshd 9237 root mem REG 253,0 15688 33750299 /usr/lib64/libkeyutils.so.1.5
sshd 9237 root mem REG 253,0 62888 33750374 /usr/lib64/libkrb5support.so.0.1
……
-d 参数
执行命令 lsof -d 12输出打开文件描述符 12 的所有项,如下所示:
lsof -d 12
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 12u unix 0xffff9e2ab51d6c00 0t0 25988 /run/systemd/private
systemd-j 4392 root 12u a_inode 0,10 0 7495 [timerfd]
auditd 8686 root 12u a_inode 0,10 0 7495 [eventfd]
dbus-daem 8724 dbus 12u unix 0xffff9e2b33fac000 0t0 44865 /run/dbus/system_bus_socket
avahi-dae 8785 avahi 12u IPv4 54551 0t0 UDP *:mdns
systemd-l 8788 root 12u unix 0xffff9e2bb62cac00 0t0 48301 socket
NetworkMa 8794 root 12u netlink 0t0 52627 KOBJECT_UEVENT
udisksd 8795 root 12u a_inode 0,10 0 7495 [eventfd]
tuned 9236 root 12u a_inode 0,10 0 7495 [eventpoll]
……
fileName
查看打开文件/usr/lib64/ld-2.17.so的进程项,如下所示
lsof /usr/lib64/ld-2.17.so
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
systemd-j 4392 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
lvmetad 4417 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
systemd-u 4429 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
auditd 8686 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
audispd 8688 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
sedispatc 8691 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
lsmd 8712 libstoragemgmt mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
rpcbind 8713 rpc mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
abrtd 8715 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
abrt-watc 8716 root mem REG 253,0 163312 33554510 /usr/lib64/ld-2.17.so
……
-i 参数
执行命令 lsof -i 4,输出 TYPE 为 IPv4 的所有项,如下所示:
lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 41u IPv4 47143 0t0 TCP *:sunrpc (LISTEN)
systemd 1 root 42u IPv4 47144 0t0 UDP *:sunrpc
rpcbind 8713 rpc 4u IPv4 47143 0t0 TCP *:sunrpc (LISTEN)
rpcbind 8713 rpc 5u IPv4 47144 0t0 UDP *:sunrpc
rpcbind 8713 rpc 10u IPv4 44332 0t0 UDP *:netconf-beep
avahi-dae 8785 avahi 12u IPv4 54551 0t0 UDP *:mdns
avahi-dae 8785 avahi 13u IPv4 54552 0t0 UDP *:36757
chronyd 8893 chrony 1u IPv4 54530 0t0 UDP localhost:323
sshd 9237 root 3u IPv4 55748 0t0 TCP *:ssh (LISTEN)
……
执行命令 lsof -i UDP 输出协议类型为 UDP 的所有项,如下所示:
lsof -i UDP
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 42u IPv4 47144 0t0 UDP *:sunrpc
systemd 1 root 45u IPv6 47146 0t0 UDP *:sunrpc
rpcbind 8713 rpc 5u IPv4 47144 0t0 UDP *:sunrpc
rpcbind 8713 rpc 7u IPv6 47146 0t0 UDP *:sunrpc
rpcbind 8713 rpc 10u IPv4 44332 0t0 UDP *:netconf-beep
rpcbind 8713 rpc 11u IPv6 44333 0t0 UDP *:netconf-beep
avahi-dae 8785 avahi 12u IPv4 54551 0t0 UDP *:mdns
avahi-dae 8785 avahi 13u IPv4 54552 0t0 UDP *:36757
chronyd 8893 chrony 1u IPv4 54530 0t0 UDP localhost:323
chronyd 8893 chrony 2u IPv6 54531 0t0 UDP localhost:323
dnsmasq 11383 nobody 3u IPv4 61779 0t0 UDP *:bootps
dnsmasq 11383 nobody 5u IPv4 61782 0t0 UDP localhost.localdomain:domain
kubelet 20062 root 5u IPv4 211268 0t0 UDP localhost.localdomain:43225->gateway:domain
dhclient 25719 root 6u IPv4 181490 0t0 UDP *:bootpc
vmstat
用法
-V:显示vmstat版本信息。
-n:只在开始时显示一次各字段名称。
-a:显示活跃和非活跃内存
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-s:显示内存相关统计信息及多种系统活动数量。
-m:显示slabinfo
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-f:显示从系统启动至今的fork数量 。
delay:刷新时间间隔。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
每秒采集一次,总共采集10次
vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
18 3 0 2470528 277184 26229064 0 0 759 4697 1 1 32 3 64 0 0
15 0 0 2374660 277244 26323800 0 0 10184 107824 45341 29018 75 5 20 0 0
21 2 0 2287116 277312 26411708 0 0 10620 90692 42217 26624 64 5 31 0 0
9 1 0 2192396 277384 26506400 0 0 32488 74548 40079 25572 60 4 35 0 0
7 0 0 2074596 277436 26624980 0 0 15112 82340 44721 28915 65 5 30 0 0
1 0 0 2022268 277480 26675624 0 0 11608 44060 24362 15309 38 3 59 0 0
17 1 0 1951776 277540 26751392 0 0 21120 86144 48276 29168 68 5 27 0 0
4 0 0 1869224 277600 26832680 0 0 10724 79760 40363 26640 59 5 36 0 0
Procs(进程)
r: 运行队列中等待被运行的进程数量,这个值也可以判断是否需要增加CPU。(长期大于cpu核数)
b: 等待IO的进程数量。
Memory(内存)
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
CPU(以百分比表示)
us: 用户进程执行时间百分比(user time)
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time).sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比